Docker 권한 및 Docker in Docker (DinD) 심화 설정
1. Docker 권한 문제 해결
1.1 Jenkins 컨테이너 내부 권한 설정
# root 권한으로 Jenkins 컨테이너 접속
docker exec -it --user root jenkins bash
# 필요한 패키지 설치 및 권한 설정
apt-get update
apt-get install -y sudo
groupadd -f docker
usermod -aG docker jenkins
# 컨테이너 나가기
exit
# Jenkins 컨테이너 재시작
docker restart jenkins
2026-10 갱신
groupadd -f docker는 컨테이너 내부에 임의의 GID로 그룹을 만들기 때문에, 호스트 /var/run/docker.sock의 그룹(GID)과 다르면 권한 문제가 그대로 남습니다. 호스트 docker 그룹과 같은 GID로 생성해야 합니다.
# 호스트에서 실행
docker exec -u 0 jenkins bash -c "groupadd -g $(getent group docker | cut -d: -f3) docker && usermod -aG docker jenkins"
1.2 호스트 시스템 Docker 소켓 권한 설정
# Docker 소켓 권한 변경
sudo chmod 666 /var/run/docker.sock
2026-10 갱신 - 보안 주의
chmod 666은 호스트의 모든 사용자/컨테이너가 Docker 데몬(사실상 root 권한)에 접근할 수 있게 만듭니다. 테스트 용도로만 사용하고, 실제로는 아래 2.2처럼 root:docker + 660으로 두고 docker 그룹(GID 일치)으로 접근을 제어해야 합니다. 또한 데몬 재시작 시 소켓이 다시 생성되면서 권한이 원복됩니다.
2. Docker in Docker (DinD) 상세 설명
2.1 DinD 구성 방식
소켓 마운트 방식
- 호스트의 Docker 데몬 사용
-v /var/run/docker.sock:/var/run/docker.sock옵션으로 구현- 장점: 리소스 효율적, 설정 간단
- 단점: 호스트의 Docker 데몬을 공유하므로 완전한 격리가 안됨
DinD 방식
docker run -d \
--name jenkins-dind \
--privileged \
-p 8080:8080 \
-p 50000:50000 \
docker:dind
- 컨테이너 내부에 별도 Docker 데몬 실행
- 장점: 호스트 Docker 데몬과 분리된 독립 데몬 사용(이미지/컨테이너가 호스트와 섞이지 않음)
- 단점: 보안 취약성 존재(privileged 권한), 리소스 소비 큼, 복잡한 설정 필요
2026-10 갱신
- 기존에는 "보안 취약성(privileged 권한)"이 장점에 들어가 있었는데, 이는 단점이므로 바로잡았습니다.
docker:dind이미지는 Docker 데몬만 들어 있고 Jenkins는 포함되어 있지 않습니다. 위 예시의-p 8080:8080 -p 50000:50000은 Jenkins 포트라 이 컨테이너에서는 의미가 없습니다. 일반적으로는 DinD 컨테이너를 따로 띄우고, Jenkins 컨테이너가DOCKER_HOST로 그 데몬에 접속하는 구성을 사용합니다.
docker run -d --name dind --privileged \
-e DOCKER_TLS_CERTDIR=/certs \
-v dind-certs:/certs \
docker:dind
- privileged를 피하고 싶다면
docker:dind-rootless, Sysbox 런타임, 또는 CI 이미지 빌드 전용으로 BuildKit(rootless)/Kaniko 같은 대안을 검토할 수 있습니다.
2.2 보안 강화를 위한 권한 제한
# Docker 그룹 권한 제한
sudo chown root:docker /usr/bin/docker
sudo chmod 750 /usr/bin/docker
# Docker 소켓 권한 제한
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
3. 문제 해결 및 디버깅
3.1 권한 문제 디버깅
# Jenkins 사용자 권한 확인
docker exec jenkins whoami
docker exec jenkins groups
# Docker 소켓 권한 확인
ls -l /var/run/docker.sock
# Docker 명령어 테스트
docker exec jenkins docker ps
3.2 로그 확인
# Jenkins 컨테이너 로그 확인
docker logs jenkins
# Docker 데몬 로그 확인
sudo journalctl -u docker
4. 보안 고려사항
최소 권한 원칙
- 필요한 최소한의 권한만 부여
- 주기적인 권한 감사 실시
네트워크 격리
# 전용 네트워크 생성
docker network create jenkins-network
# 네트워크 적용
docker run -d \
--name jenkins \
--network jenkins-network \
-p 8080:8080 \
-v jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
2026-10 갱신
기존 예시는 마지막 줄이 \로 끝나 이미지 이름이 빠진 미완성 명령이었습니다. 문서 흐름(Jenkins 컨테이너를 전용 네트워크에 연결)에 맞춰 jenkins/jenkins:lts로 완성했습니다. 포트/볼륨은 상위 가이드와 동일한 값입니다.
볼륨 마운트 제한
- 필요한 디렉토리만 선택적으로 마운트
- 중요 시스템 디렉토리 마운트 제한